#include <sstream>
#include "Nivel.h"

using namespace TP::Juego::Arena;

Nivel::Nivel() { }

Nivel::Nivel(unsigned id, unsigned anchura, unsigned altura, unsigned tiempo,
		const std::string &rutaImagenFondo) {
	_escenario = new Escenario(altura, anchura, rutaImagenFondo);
	_id = id;
	_tiempo = tiempo;
}

Nivel::~Nivel() {
	if (_escenario != NULL) {
		delete _escenario;
	}
}

unsigned Nivel::getId() const {
	return _id;
}

unsigned Nivel::getTiempo() const {
	return _tiempo;
}

Escenario* Nivel::getEscenario() {
	return _escenario;
}

Nivel* Nivel::clonar() {
	Nivel *nivel = new Nivel();
	nivel->_id = _id;
	nivel->_tiempo = _tiempo;
	nivel->_escenario = _escenario->clonar();
	return nivel;
}

bool Nivel::operator==(const Nivel &nivel) {
	return (_id == nivel._id);
}

bool Nivel::operator!=(const Nivel &nivel) {
	return (_id != nivel._id);
}

string Nivel::aXML() {
	TiXmlDocument* doc = new TiXmlDocument();
	TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");
	doc->LinkEndChild(decl);

	doc->LinkEndChild(this->aElementoXML());

	TiXmlPrinter printer;
	doc->Accept(&printer);
	return printer.CStr();
}

string Nivel::aXML(const string& pPath) {
	TiXmlDocument* doc = new TiXmlDocument(pPath.c_str());
	TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");
	doc->LinkEndChild(decl);

	doc->LinkEndChild(this->aElementoXML());

	TiXmlPrinter printer;
	doc->Accept(&printer);
	return printer.CStr();
}

void Nivel::parseXML(const string& pDescriptor) {
	TiXmlDocument doc;
	doc.Parse(pDescriptor.c_str(), 0, TIXML_ENCODING_UTF8);
	return this->deElementoXML(doc.FirstChildElement());
}

TiXmlElement* Nivel::aElementoXML() {
	TiXmlElement * element = new TiXmlElement("Nivel");

	std::stringstream stream;
	stream << this->_id;
	element->SetAttribute("id", stream.str().c_str());

	stream.str(std::string());
	stream << this->_tiempo;
	element->SetAttribute("tiempo", stream.str().c_str());

	if (NULL == this->_escenario)
		element->LinkEndChild(new TiXmlElement("NULL"));
	else
		element->LinkEndChild(this->_escenario->aElementoXML());

	return element;
}

void Nivel::deElementoXML(TiXmlElement* pElemento) {
	if (strcmp(pElemento->Value(), "Nivel") == 0) {
		std::stringstream stream;
		stream << pElemento->Attribute("id");
		stream >> this->_id;

		std::stringstream streamTiempo;
		streamTiempo << pElemento->Attribute("tiempo");
		streamTiempo >> this->_tiempo;

		this->_escenario = NULL;
		if ("NULL" != pElemento->FirstChildElement()->ValueTStr()) {
			this->_escenario = new Escenario();
			this->_escenario->deElementoXML(pElemento->FirstChildElement());
		}
	}
}
